import librosa import numpy as np import matplotlib.pyplot as plt # Загрузка аудиофайла audio, sr = librosa.load('audio.wav', sr=22050) # Информация print(f"Sample rate: {sr} Hz") print(f"Длительность: {len(audio)/sr:.2f} сек") print(f"Shape: {audio.shape}") # Визуализация waveform plt.figure(figsize=(12, 4)) librosa.display.waveshow(audio, sr=sr) plt.title('Waveform') plt.xlabel('Время (с)') plt.ylabel('Амплитуда')🔷 3. Spectrogram (Спектрограмма)
Идея: визуализация частотного содержания во времени
- Ось X: время
- Ось Y: частота
- Цвет/Яркость: интенсивность (амплитуда/мощность)
- Метод: STFT (Short-Time Fourier Transform)
# Вычисление спектрограммы D = librosa.stft(audio, n_fft=2048, hop_length=512) magnitude = np.abs(D) power = magnitude**2 # Преобразование в дБ spectrogram_db = librosa.amplitude_to_db(magnitude, ref=np.max) # Визуализация plt.figure(figsize=(12, 4)) librosa.display.specshow( spectrogram_db, sr=sr, hop_length=512, x_axis='time', y_axis='hz' ) plt.colorbar(format='%+2.0f dB') plt.title('Спектрограмма')🔷 4. Mel-Spectrogram
Mel-шкала: шкала частот, близкая к восприятию человека
- Нелинейная шкала частот
- Больше деталей на низких частотах
- Меньше на высоких (где слух менее чувствителен)
- Стандарт для распознавания речи
# Mel-спектрограмма mel_spec = librosa.feature.melspectrogram( y=audio, sr=sr, n_fft=2048, hop_length=512, n_mels=128, # количество mel-полос fmax=8000 # максимальная частота ) # В дБ mel_spec_db = librosa.power_to_db(mel_spec, ref=np.max) # Визуализация plt.figure(figsize=(12, 4)) librosa.display.specshow( mel_spec_db, sr=sr, hop_length=512, x_axis='time', y_axis='mel' ) plt.colorbar(format='%+2.0f dB') plt.title('Mel-Спектрограмма')🔷 5. MFCC (Mel-Frequency Cepstral Coefficients)
Цель: компактное представление спектра звука
- Шаги:
- Вычислить mel-спектрограмму
- Взять логарифм
- Применить DCT (Discrete Cosine Transform)
- Взять первые N коэффициентов
- Обычно: 13-40 коэффициентов
- Первый коэффициент: средняя энергия (часто удаляют)
# Вычисление MFCC mfccs = librosa.feature.mfcc( y=audio, sr=sr, n_mfcc=13, # количество коэффициентов n_fft=2048, hop_length=512 ) # Визуализация plt.figure(figsize=(12, 4)) librosa.display.specshow( mfccs, sr=sr, hop_length=512, x_axis='time' ) plt.colorbar() plt.title('MFCC') plt.ylabel('MFCC коэффициенты') plt.show() # Статистики для ML mfcc_mean = np.mean(mfccs, axis=1) mfcc_std = np.std(mfccs, axis=1) features = np.concatenate([mfcc_mean, mfcc_std])
| Признак | Описание | Применение |
|---|---|---|
| Zero Crossing Rate | Частота смены знака | Шумы vs музыка |
| Spectral Centroid | Центр масс спектра | Яркость звука |
| Spectral Rolloff | Частота ниже которой 85% энергии | Тембр |
| Chroma | 12 pitch classes | Музыкальный анализ |
| Tempo | Темп в BPM | Ритм |
# Zero Crossing Rate
zcr = librosa.feature.zero_crossing_rate(audio)
# Spectral Centroid
spec_cent = librosa.feature.spectral_centroid(y=audio, sr=sr)
# Spectral Rolloff
spec_rolloff = librosa.feature.spectral_rolloff(y=audio, sr=sr)
# Chroma features
chroma = librosa.feature.chroma_stft(y=audio, sr=sr)
# Tempo
tempo, beats = librosa.beat.beat_track(y=audio, sr=sr)
print(f"Tempo: {tempo:.2f} BPM")
# Удаление тишины
audio_trimmed, index = librosa.effects.trim(
audio,
top_db=20 # порог в дБ
)
# Нормализация
audio_norm = librosa.util.normalize(audio)
# Изменение sample rate
audio_resampled = librosa.resample(
audio,
orig_sr=sr,
target_sr=16000
)
# Добавление шума (augmentation)
noise = np.random.randn(len(audio))
audio_noisy = audio + 0.005 * noise
# Изменение высоты тона
audio_pitched = librosa.effects.pitch_shift(
audio,
sr=sr,
n_steps=2 # полутона
)
# Изменение скорости
audio_stretched = librosa.effects.time_stretch(
audio,
rate=1.2 # в 1.2 раза быстрее
)
def extract_features(audio_path):
"""Извлечь все признаки из аудио"""
# Загрузка
audio, sr = librosa.load(audio_path, sr=22050)
# MFCC
mfccs = librosa.feature.mfcc(y=audio, sr=sr, n_mfcc=13)
mfcc_mean = np.mean(mfccs, axis=1)
mfcc_std = np.std(mfccs, axis=1)
# Spectral features
spec_cent = librosa.feature.spectral_centroid(y=audio, sr=sr)
spec_cent_mean = np.mean(spec_cent)
zcr = librosa.feature.zero_crossing_rate(audio)
zcr_mean = np.mean(zcr)
# Chroma
chroma = librosa.feature.chroma_stft(y=audio, sr=sr)
chroma_mean = np.mean(chroma, axis=1)
# Объединение всех признаков
features = np.concatenate([
mfcc_mean,
mfcc_std,
[spec_cent_mean],
[zcr_mean],
chroma_mean
])
return features
# Использование
features = extract_features('audio.wav')
print(f"Feature vector shape: {features.shape}")
import audiomentations as A
# Библиотека для аугментации
augmenter = A.Compose([
A.AddGaussianNoise(min_amplitude=0.001, max_amplitude=0.015, p=0.5),
A.TimeStretch(min_rate=0.8, max_rate=1.2, p=0.5),
A.PitchShift(min_semitones=-4, max_semitones=4, p=0.5),
A.Shift(min_fraction=-0.5, max_fraction=0.5, p=0.5),
])
# Применение
augmented_audio = augmenter(samples=audio, sample_rate=sr)
| Параметр | Описание | Типичные значения |
|---|---|---|
n_fft | Размер окна FFT | 512, 1024, 2048 |
hop_length | Шаг окна | n_fft/4 (512) |
win_length | Длина окна | = n_fft |
window | Оконная функция | 'hann' (по умолч.) |
Частотное разрешение: sr / n_fft
Временное разрешение: hop_length / sr
Компромисс: большое n_fft → лучше частотное разрешение, но хуже временное
import torch
import torchaudio
import torchaudio.transforms as T
# Загрузка
waveform, sample_rate = torchaudio.load('audio.wav')
# Mel-спектрограмма трансформация
mel_transform = T.MelSpectrogram(
sample_rate=sample_rate,
n_fft=2048,
hop_length=512,
n_mels=128
)
# Применение
mel_spec = mel_transform(waveform)
# В дБ
power_to_db = T.AmplitudeToDB()
mel_spec_db = power_to_db(mel_spec)
# MFCC трансформация
mfcc_transform = T.MFCC(
sample_rate=sample_rate,
n_mfcc=13,
melkwargs={
'n_fft': 2048,
'hop_length': 512,
'n_mels': 128
}
)
mfcc = mfcc_transform(waveform)
print(f"Mel-spec shape: {mel_spec.shape}")
print(f"MFCC shape: {mfcc.shape}")
«Спектрограмма — это как "фотография" звука, показывающая какие частоты присутствуют в каждый момент времени. MFCC — это компактный набор чисел, описывающих характеристики звука, который хорошо подходит для распознавания речи и музыки».